home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 18 / AMIGAplus Sonderheft 18 (1999)(ICP)(DE)[!].iso / PD / Spiele / lazymines / lazymines_src / timer.c < prev    next >
C/C++ Source or Header  |  1999-01-03  |  2KB  |  119 lines

  1. /*
  2.  * timer.c
  3.  * =======
  4.  * Implementation of a timer.
  5.  *
  6.  * Copyright (C) 1994-1998 Håkan L. Younes (lorens@hem.passagen.se)
  7.  */
  8.  
  9. #include <exec/memory.h>
  10. #include <proto/exec.h>
  11. #include <devices/timer.h>
  12.  
  13. #include "timer.h"
  14.  
  15.  
  16. /* Timer data */
  17. struct timer
  18. {
  19.    struct MsgPort      *mp;
  20.    struct timerequest  *io;
  21.    BOOL                 used;
  22. };
  23.  
  24.  
  25. /* Creates a new timer object */
  26. timer_ptr             /* created timer */
  27. timer_create (void)
  28. {
  29.    timer_ptr   timer;
  30.    
  31.    if (timer = AllocVec (sizeof (*timer), MEMF_PUBLIC))
  32.    {
  33.       timer->mp = NULL;
  34.       timer->io = NULL;
  35.       timer->used = FALSE;
  36.       if (timer->mp = CreateMsgPort ())
  37.       {
  38.          if (timer->io = (struct timerequest *)
  39.                          CreateIORequest (timer->mp, sizeof (*timer->io)))
  40.          {
  41.             if (0 == OpenDevice (TIMERNAME, UNIT_VBLANK,
  42.                                  (struct IORequest *)timer->io, 0L))
  43.             {
  44.                return timer;
  45.             }
  46.             DeleteIORequest (timer->io);
  47.          }
  48.          DeleteMsgPort (timer->mp);
  49.       }
  50.       FreeVec (timer);
  51.    }
  52.    
  53.    return NULL;
  54. }
  55.  
  56.  
  57. /* Frees a timer object */
  58. void
  59. timer_free (
  60.    timer_ptr   timer)   /* timer to free */
  61. {
  62.    if (timer)
  63.    {
  64.       timer_stop (timer);
  65.       CloseDevice ((struct IORequest *)timer->io);
  66.       DeleteIORequest ((struct IORequest *)timer->io);
  67.       DeleteMsgPort (timer->mp);
  68.       FreeVec (timer);
  69.    }
  70. }
  71.  
  72.  
  73. /* Calculates the signal of a timer */
  74. ULONG          /* calculated signal */
  75. timer_signal (
  76.    timer_ptr   timer)   /* timer to calculate signal for */
  77. {
  78.    return (ULONG)(1L << timer->mp->mp_SigBit);
  79. }
  80.  
  81.  
  82. /* Starts a timer */
  83. void
  84. timer_start (
  85.    timer_ptr   timer,   /* timer to start */
  86.    ULONG       secs,    /* number of seconds timer will count */
  87.    ULONG       micro)   /* number of microseconds the timer will count */
  88. {
  89.    timer->io->tr_node.io_Command = TR_ADDREQUEST;
  90.    timer->io->tr_time.tv_secs = secs;
  91.    timer->io->tr_time.tv_micro = micro;
  92.    SendIO ((struct IORequest *)timer->io);
  93.    timer->used = TRUE;
  94. }
  95.  
  96.  
  97. /* Replies a timer */
  98. void
  99. timer_reply (
  100.    timer_ptr   timer)   /* timer to reply */
  101. {
  102.    while (GetMsg (timer->mp))
  103.       ;
  104. }
  105.  
  106.  
  107. /* Stops a timer */
  108. void
  109. timer_stop (
  110.    timer_ptr   timer)   /* timer to stop */
  111. {
  112.    if (timer->used)
  113.    {
  114.       AbortIO ((struct IORequest *)timer->io);
  115.       WaitIO ((struct IORequest *)timer->io);
  116.       SetSignal (0L, timer_signal (timer));
  117.    }
  118. }
  119.